package juc.blockqueue.linkedtransferqueue;

/**
 * @ClassName HighPerformanceProducerConsumer
 * @PackageName juc.blockqueue.linkedtransferqueue
 * @projectName myThread
 * @Description TODO
 * @Author games
 * @Date 2025/9/4 下午3:45
 * @Version 1.0
 */
import java.util.concurrent.LinkedTransferQueue;
import java.util.concurrent.TransferQueue;
import java.util.Random;

public class HighPerformanceProducerConsumer {
    /**
     * 主方法，演示TransferQueue的使用，包括高优先级生产者、普通生产者和消费者
     * @param args 命令行参数（未使用）
     *
     * 性能优化：
     * 对于需要立即处理的任务，优先使用 transfer 或 tryTransfer
     * 对于可以缓冲的任务，使用 put
     *
     *
     */
    public static void main(String[] args) {
        // 创建一个基于链表的传输队列
        TransferQueue<String> queue = new LinkedTransferQueue<>();
        // 创建随机数生成器，用于模拟随机行为
        Random random = new Random();

        // 高优先级生产者（使用 transfer 直接传递）
        Thread highPriorityProducer = new Thread(() -> {
            try {
                for (int i = 1; i <= 3; i++) {
                    String task = "High-Priority-Task-" + i;
                    System.out.println("高优先级生产者准备传递: " + task);
                    queue.transfer(task); // 直接传递给等待的消费者
                    System.out.println("高优先级任务已传递: " + task);
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        });

        // 普通生产者（使用 put 存储到队列）
        Thread normalProducer = new Thread(() -> {
            try {
                for (int i = 1; i <= 3; i++) {
                    String task = "Normal-Task-" + i;
                    queue.put(task); // 存储到队列
                    System.out.println("普通生产者添加到队列: " + task);
                    Thread.sleep(500);
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        });

        // 消费者
        Thread consumer = new Thread(() -> {
            try {
                for (int i = 0; i < 6; i++) {
                    Thread.sleep(1000); // 模拟处理时间
                    String task = queue.take();
                    System.out.println("消费者处理任务: " + task);
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        });

        consumer.start();
        highPriorityProducer.start();
        normalProducer.start();
    }
}
